﻿using log4net;
using PcaCore.BOL.Log;
using System;
using System.Collections.Generic;
using System.Linq;
using System.Reflection;
using System.Text;
using System.Threading.Tasks;
using System.Web;

namespace PcaCore.DAL.Log
{
    public class dSesion
    {
        private static readonly ILog log = LogManager.GetLogger(typeof(dSesion));
        
        #region Private

        private static long Insert(oSesion myClass)
        {
            try
            {
                //CREATE OR REPLACE FUNCTION pca_log.fn_add_sesion(varchar,--empresa_id $1
                //         varchar,--oficina_id $2
                //         character,--usuario_id $3
                //         varchar --ip $4
                //         )RETURNS bigint
                return Convert.ToInt64(Core.ExecuteScalar("pca_log.fn_add_sesion",
                                          new oParametro(NpgsqlTypes.NpgsqlDbType.Varchar, myClass.empresa_id),
                                          new oParametro(NpgsqlTypes.NpgsqlDbType.Varchar, myClass.oficina_id),
                                          new oParametro(NpgsqlTypes.NpgsqlDbType.Varchar, myClass.usuario_id),
                                          new oParametro(NpgsqlTypes.NpgsqlDbType.Varchar, myClass.ip)));
            }
            catch (Exception ex)
            {
                throw Core.LogException(log, ex, MethodBase.GetCurrentMethod().Name);
            }
        }

        #endregion

        public static oVwSesion Get(long sessionId)
        {
            try
            {

                //CREATE OR REPLACE FUNCTION pca_log.fn_get_sesion(bigint --sesion_id $1
                //             )RETURNS SETOF pca_log.vw_sesiones
                return Core.GetObjectDb<oVwSesion>("pca_log.fn_get_sesion",
                                                    new oParametro(NpgsqlTypes.NpgsqlDbType.Bigint, sessionId));
            }
            catch (Exception ex)
            {
                throw Core.LogException(log, ex, MethodBase.GetCurrentMethod().Name);
            }
        }

        /// <summary>
        /// Devuelve el id de sesion actual
        /// </summary>
        /// <returns></returns>
        public static long GetId()
        {
            return (HttpContext.Current.Session["sesionId"] != null) ? Convert.ToInt64(HttpContext.Current.Session["sesionId"]) : 0;
        }

        /// <summary>
        /// Devuelve el id de la empresa para la sesion actual
        /// </summary>
        /// <returns></returns>
        public static string GetEmpresaId()
        {
            return (HttpContext.Current.Session["empresaId"] != null) ? HttpContext.Current.Session["empresaId"].ToString() : "";
        }

        /// <summary>
        /// Devuelve el id de la oficina para la sesion actual
        /// </summary>
        /// <returns></returns>
        public static string GetOficinaId()
        {
            return (HttpContext.Current.Session["oficinaId"] != null) ? HttpContext.Current.Session["oficinaId"].ToString() : "";
        }

        /// <summary>
        /// Devuelve el id de usuario actual
        /// </summary>
        /// <returns></returns>
        public static string GetUsuarioId()
        {
            return (HttpContext.Current.Session["usuarioId"] != null) ? HttpContext.Current.Session["usuarioId"].ToString() : "";
        }

        public static void Insert(string empresaId,
                                  string oficinaId,
                                  string usuarioId,
                                  string ip)
        {
            try
            {
                oSesion myClass = new oSesion();
                myClass.empresa_id = empresaId;
                myClass.oficina_id = oficinaId;
                myClass.usuario_id = usuarioId;
                myClass.ip = ip;

                long idSesion = dSesion.Insert(myClass);

                HttpContext.Current.Session["sesionId"] = idSesion;
                HttpContext.Current.Session["empresaId"] = empresaId;
                HttpContext.Current.Session["oficinaId"] = oficinaId;
                HttpContext.Current.Session["usuarioId"] = usuarioId;
            }
            catch (Exception ex)
            {
                throw Core.LogException(log, ex, MethodBase.GetCurrentMethod().Name);
            }
        }
    }
}
